/**
 * Description:     对bmp灰度位图进行直方图均衡化操作。
 * Function:        int imgH(GARYSCALEBIT garyscalebit);        直方图均衡化
 * Solution:        如果你在使用本头文件时发现了任何问题，请报告issue.
 * Contributer:     叶月枫
 */

#ifndef imgH_h
#define imgH_h

// 声明函数
int imgH(GARYSCALEBIT garyscalebit);

/**
 * Function:    对bmp灰度位图进行直方图均衡化
 * Parameter:   garyscalebit    [in]GARYSCALEBIT结构体，包括原图的灰度信息、数据个数和排列顺序
 * Return:      0               操作成功
 */
int imgH(GARYSCALEBIT garyscalebit)
{
    // 数据载入
    int dataCount = garyscalebit.dataCount; // 总的数据量
    int histogram[256] = {0}; // 直方图
    int cdf[256] = {0}; // 累积分布函数
    int newPixel[256]; // 新的灰度值 
    float scale = 255.0f / (dataCount); // 归一化

    // 计算直方图
    for (int i = 0; i < dataCount; i++)
    {
        histogram[garyscalebit.garyscale[i]]++;
    }

    // 计算累积分布函数(CDF)
    cdf[0] = histogram[0];
    for (int i = 1; i < 256; i++)
    {
        cdf[i] = cdf[i - 1] + histogram[i];
    }

    // 计算新的像素值
    for (int i = 0; i < 256; i++)
    {
        newPixel[i] = (int)(cdf[i] * scale);
    }

    // 应用直方图均衡化
    for (int i = 0; i < dataCount; i++)
    {
        garyscalebit.garyscale[i] = newPixel[garyscalebit.garyscale[i]];
    }

    return 0;
}

#endif